// 创建守护进程(daemon)测试

#include <my_header.h>

int main(int argc, char *argv[]){
    /*------------------------------创建守护进程------------------------------*/
    // 1.创建子进程，然后让父进程终止。
    pid_t pid = fork();
    if(pid<0){
        perror("fork failed.");
        exit(EXIT_FAILURE);
    }else if(pid>0){ // 父进程直接终止
        exit(EXIT_SUCCESS); 
    }
    printf("daemon_pid = %d\n", getpid()); // 打印子进程pid

    // 2.在子进程当中创建新会话。
    pid_t sid = setsid();

    // 3.修改当前工作目录为根目录(/)，以避免占用临时目录导致该目录无法在文件系统中卸载
    chdir("/");
    
    // 4.重设文件权限掩码为0，避免创建文件的权限受限。
    umask(0);
    
    // 5.关闭所有继承的文件描述符,避免资源泄漏
    for(int i = sysconf(_SC_OPEN_MAX); i>=0; --i){
        close(i);
    }

    // 6.重定向标准输入/输出/错误到 /dev/null，防止守护进程意外读写终端
    open("/dev/null", O_RDONLY); // stdin
    open("/dev/null", O_RDWR);   // stdout
    open("/dev/null", O_RDWR);   // stderr
    /*------------------------------创建守护进程------------------------------*/


    /*---------------------------处理守护进程的业务---------------------------*/
    while(1){
        // 每10秒向日志输出一次
        sleep(10);

        // 写出到系统日志
        syslog(LOG_INFO, "Daemon(pid = %d) is running.\n", getpid());
    }
    /*---------------------------处理守护进程的业务---------------------------*/

    return 0;
}